	package com.escool.controller;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import com.escool.dto.ActividadMateria;
import com.escool.model.TbExpedienteHasMateria;
import com.escool.model.TbExpedienteMateriaHasRotacionesActividad;
import com.escool.model.TbRotacionesHasActividad;
import com.escool.service.ExpedienteService;
import com.escool.service.FindService;
import com.escool.service.PeriodoEvaluacionService;
import com.escool.service.RotacionActividadService;
import com.escool.service.RotacionesService;

@Controller
public class RotacionActividadController {
	
	@Autowired
	RotacionActividadService rotacionActividadService;
	@Autowired
	RotacionesService rotacionesService;
	@Autowired
	ExpedienteService expedienteService;
	@Autowired
	FindService findService;
	@Autowired
	PeriodoEvaluacionService pService;


	@RequestMapping("showRotActividad")
	public String showRotacionActividad(ModelMap map, HttpServletRequest request){
		String id = request.getParameter("id");
		String error = request.getParameter("error");
		if(error != null && Integer.parseInt(error) == 1) map.addAttribute("error", "El total del porcentaje de las evaluaciones debe ser igual a 100");
		TbRotacionesHasActividad obj = new TbRotacionesHasActividad();
		obj.setTbRotaciones(rotacionesService.findTbRotaciones(Integer.parseInt(id)));
		map.put("rotact", obj);
		map.put("rotactList", rotacionActividadService.listByRotacionesId(obj.getTbRotaciones().getIdtbRotaciones()));
		map.put("periodoList", pService.listPeriodo());
		return "rotacionActividad";
	}
	
	@RequestMapping("addRotActividad")
	public String showRotacionActividad(@ModelAttribute("rotact") @Valid TbRotacionesHasActividad tbRotacionesHasActividad,BindingResult result){
		if(!result.hasErrors()){
			tbRotacionesHasActividad.setCargado('P');
			rotacionActividadService.add(tbRotacionesHasActividad);
			System.out.println(tbRotacionesHasActividad.getTbActividad().getNombreActividad() + ":" + tbRotacionesHasActividad.getCargado());
			return "redirect:/showRotActividad?id="+tbRotacionesHasActividad.getTbRotaciones().getIdtbRotaciones();
		}
		return "";
	}
	
	@RequestMapping("updateRotActividad")
	public String updateRotActividad(@ModelAttribute("rotact") @Valid TbRotacionesHasActividad tbRotacionesHasActividad,BindingResult result, HttpServletRequest request){
		
		if(!result.hasErrors()){
			
			System.out.println(tbRotacionesHasActividad.getTbActividad().getIdActividad());
			rotacionActividadService.edit(tbRotacionesHasActividad);
			return "redirect:/showRotActividad?id="+tbRotacionesHasActividad.getTbRotaciones().getIdtbRotaciones();
		}
		return "";
	}

	@RequestMapping("addExpActividad")
	public String addExpActividad(@ModelAttribute("rotact") @Valid TbRotacionesHasActividad tbRotacionesHasActividad,BindingResult result){
		try{
			
		System.out.println("materia:" + tbRotacionesHasActividad.getTbRotaciones().getTbSedeSeccionHasMateria().getIdSedeSeccionHasMateria());
		System.out.println("rotacion:" +tbRotacionesHasActividad.getTbRotaciones().getIdtbRotaciones());
		System.out.println("periodo:" + tbRotacionesHasActividad.getPeriodoEvaluacion());
		if(porcActividad(tbRotacionesHasActividad)) {
			
			return "redirect:/showRotActividad?id="+tbRotacionesHasActividad.getTbRotaciones().getIdtbRotaciones()+"&error=1";
			
		}
		
		List xm = expedienteService.listExpMatByMateria(tbRotacionesHasActividad.getTbRotaciones().getTbSedeSeccionHasMateria().getIdSedeSeccionHasMateria());
		List ra = rotacionActividadService.listByRotacionesId(tbRotacionesHasActividad.getTbRotaciones().getIdtbRotaciones(),'P');
		if(!xm.isEmpty()){
			Iterator i = xm.iterator();
			while(i.hasNext()){		    	
			TbExpedienteHasMateria tmp = (TbExpedienteHasMateria) i.next();
			String mat = tmp.getTbSedeSeccionHasMateria().getTbMateria().getNombreMateria();
			if(!ra.isEmpty()){
				Iterator it = ra.iterator();
				while(it.hasNext()){					
					TbRotacionesHasActividad temp = (TbRotacionesHasActividad) it.next();
					TbExpedienteMateriaHasRotacionesActividad ema = new TbExpedienteMateriaHasRotacionesActividad();
					ema.setTbExpedienteHasMateria(tmp);
					ema.setTbRotacionesHasActividad(temp);
					System.out.println(temp.getPeriodoEvaluacion());
					expedienteService.addTbExpedienteMateriaHasRotacionesActividad(ema);
					String act = temp.getTbActividad().getNombreActividad();
					System.out.println(mat + "," + act);
					System.out.println(ema.getTbExpedienteHasMateria() + "," + ema.getTbRotacionesHasActividad());
					ema = null;
				}
				upActividad(tbRotacionesHasActividad);
				System.out.println("Se cargaron");
			}
			}
		}
		
		}
		catch(Exception ex){
			
			ex.printStackTrace();
		}
		
		return "redirect:/showRotActividad?id="+tbRotacionesHasActividad.getTbRotaciones().getIdtbRotaciones();
	}
	
	public boolean porcActividad(TbRotacionesHasActividad tbRotacionesHasActividad) throws Exception{
	
		List ra = rotacionActividadService.listByRotacionesId(tbRotacionesHasActividad.getTbRotaciones().getIdtbRotaciones(),'P');
		Iterator it = ra.iterator();
		float f=0;
		while(it.hasNext()){
			TbRotacionesHasActividad dto = (TbRotacionesHasActividad)it.next();
			System.out.println(dto.getPorcentajeActividad());
			f += dto.getPorcentajeActividad();
		}
		System.out.println(f);
		return (f!=100);
	
}
	
	public void upActividad(TbRotacionesHasActividad tbRotacionesHasActividad) throws Exception{
		
			List ra = rotacionActividadService.listByRotacionesId(tbRotacionesHasActividad.getTbRotaciones().getIdtbRotaciones(),'P');
			Iterator it = ra.iterator();
			while(it.hasNext()){
				TbRotacionesHasActividad dto = (TbRotacionesHasActividad)it.next();
				dto.setCargado('C');
				rotacionActividadService.edit(dto);
			}
			
		
	}
	
	@RequestMapping("showAlumnosActividad")
	public String showAlumnosActividad(@ModelAttribute("rotact") @Valid TbRotacionesHasActividad tbRotacionesHasActividad,BindingResult result,Map<String, Object> map){			
		System.out.println("rotacion id" + tbRotacionesHasActividad.getIdRotacionesHasActividad());
		ActividadMateria dto = new ActividadMateria();
		dto.setIdRotacionesHasActividad(tbRotacionesHasActividad.getIdRotacionesHasActividad().toString());
		map.put("dto", dto);
		map.put("actividad", tbRotacionesHasActividad.getTbActividad());
		map.put("materia", tbRotacionesHasActividad.getTbRotaciones().getTbSedeSeccionHasMateria().getTbMateria());
		map.put("alumnosList", findService.listVwNotas(tbRotacionesHasActividad.getIdRotacionesHasActividad()));		
		return "actividadNotas";
	}
	
	@RequestMapping("showAlumnosActividad_2")
	public String showAlumnosActividad_2(@ModelAttribute("dto") @Valid ActividadMateria dto,BindingResult result,Map<String, Object> map,HttpServletRequest request){
		dto.setIdRotacionesHasActividad(request.getParameter("id"));
		map.put("dto", dto);
		map.put("alumnosList", findService.listVwNotas(Integer.parseInt(dto.getIdRotacionesHasActividad())));		
		return "actividadNotas";
	}
	
	@RequestMapping("addActividadNota")
	public String addActividadNota(@ModelAttribute("dto") @Valid ActividadMateria dto,BindingResult result,Map<String, Object> map,HttpServletRequest request){			
		
		String param = request.getParameter("param");
		System.out.println("parametro "+param);	
		String idRotacionActividadExp = null;
		String notas = null; 
		String cadena = null;
		StringTokenizer token = new StringTokenizer(param,","); 
		while(token.hasMoreTokens()){
			cadena = token.nextToken();
			StringTokenizer token2 = new StringTokenizer(cadena,":");
			while(token2.hasMoreTokens()){
				idRotacionActividadExp = token2.nextToken();
				notas = token2.nextToken();
				TbExpedienteMateriaHasRotacionesActividad dto2 = expedienteService.findActividad(Integer.parseInt(idRotacionActividadExp));
				
				dto2.setNotaActividad(Double.parseDouble(notas));
				expedienteService.updateTbExpedienteMateriaHasRotacionesActividad(dto2);
			}
		}
		return "redirect:/showAlumnosActividad_2?id="+dto.getIdRotacionesHasActividad();
	}
}
